<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const obj = {
                a: {
                    b: {
                        c: 1
                    }
                }
            }
            // const res = Object.freeze(obj);
            // const res1 = Object.freeze(111);
            // const res2 = Object.freeze('111');
            // console.log(res1); // 非严格模式下，Object.freeze()传入什么，就返回什么
            // console.log(res2);

        // res.a = 111;
        // res.a.b = 111;
        // console.log(res); //a不会被修改。但是b被修改了。可以证明freeze是浅冻结

        // obj.a = 111;
        // obj.a.b = 111;
        // console.log(obj);
        console.log(Object.freeze(obj) === obj); // true 两个对象是一个引用

        // 实现深冻结
        Object.deepFreeze = function(obj) {
            var _key = Object.getOwnPropertyNames(obj);
            if (_key.length) {
                _key.forEach(k => {
                    var _value = obj[k];
                    if (typeof _value === 'object' && _value !== null) {
                        Object.deepFreeze(_value)
                    }
                })
            }
            return Object.freeze(obj)
        }
        const res = Object.deepFreeze(obj)
        res.a = 111;
        res.a.b = 111;
        console.log(res); //  被深冻结后，全部不能修改

        obj.a = 111;
        obj.a.b = 111;
        console.log(obj); //
    </script>
</body>

</html>